﻿using System.Collections.Generic;
using System.Linq;
using MIAP.DataAccess.Interfaces;
using MIAP.Entidades;

namespace MIAP.Negocio
{
    /// <summary>
    /// Clase de negocio para la vista Consulta Carga Proyecto.
    /// </summary>
    public class ConsultaCargasProyectoNegocio
    {
         #region Campos

        /// <summary>
        /// Instancia para el acceso a datos de Consulta cargas proyecto.
        /// </summary>
        private readonly IConsultaCargasProyectoDao daoConsultaCargas;

        /// <summary>
        /// Instancia para las operaciones de negocio comunes a la aplicación.
        /// </summary>
        private ComunesNegocio comunesNegocio;

        /// <summary>
        /// instanciapara el acceso a datos de archivos
        /// </summary>
        private readonly IArchivosDao daoArchivos;

        #endregion

        #region Constructor

        /// <summary>
        /// Inicializa una instancia de <see cref="ConsultaCargasProyectoNegocio"/>
        /// </summary>
        public ConsultaCargasProyectoNegocio()
        {
            this.daoConsultaCargas = DataAccessFactory.Instance.CreateConsultaCargasProyectoDao();
            this.comunesNegocio = new ComunesNegocio();
            this.daoArchivos = DataAccessFactory.Instance.CreateArchivosDao();
        }

        #endregion

        /// <summary>
        /// Obtiene todos los archivos obligatorios.
        /// </summary>
        /// <param name="archivoAsociadoFilters">Filtros para obtener los archivos obligatorios.</param>        
        /// <param name="esObligatorio">Indica si se buscan archivos obligatorios o no</param>
        /// <returns>Lista con los archivos obligatorios de acuerdo a los filtros.</returns>
        public List<ArchivoAsociadoProyectoInfo> GetArchivosObligatoriosAndNoObligatorios(ArchivoAsociadoProyectoInfo archivoAsociadoFilters, bool esObligatorio)
        {
            var listaArchivos = this.daoArchivos.GetArchivos(null, archivoAsociadoFilters.IdProyecto, null,
                                                             esObligatorio, null, true);
            var retorno = this.daoConsultaCargas.GetArchivosObligatoriosAndNoObligatorios(archivoAsociadoFilters, esObligatorio).ToList();

            foreach (var archivo in listaArchivos.Where(archivo => retorno.All(elemento => elemento.IdArchivo != archivo.IdentificadorArchivo)))
            {
                retorno.Add(new ArchivoAsociadoProyectoInfo()
                {
                    IdArchivo = archivo.IdentificadorArchivo,
                    NombreArchivo = archivo.NombreArchivo,
                    NombreProyecto = archivo.Proyecto.NombreProyecto,
                    Carga = "NO",
                    Version = archivo.EsVersionable ? "SI" : "NO",
                    Versionable = archivo.EsVersionable
                });
            }
            return retorno;            
        }

        /// <summary>
        /// Obtiene todas las cargas y recargas de archivos realizadas de acuerdo a los filtros.
        /// </summary>
        /// <param name="archivoAsociadoFilters">Filtros para la búsqueda.</param>
        /// <returns>Lista con las cargas y recargas de archivos.</returns>
        public List<ArchivoCargadoInfo> GetCargasRealizadasByPeriodo(ArchivoAsociadoProyectoInfo archivoAsociadoFilters)
        {
            List<ArchivoCargadoInfo> listCargasRealizadas;

            listCargasRealizadas = this.daoConsultaCargas.GetCargasRealizadasByPeriodo(archivoAsociadoFilters).ToList();

            List<ArchivoCargadoInfo> listCargasRealizadasByArchivo = ComunesNegocio.GetArchivoWithLastProcess(listCargasRealizadas);

            List<CatalogoInfo> listArchivosCarga = new List<CatalogoInfo>();

            foreach (ArchivoCargadoInfo archivo in listCargasRealizadasByArchivo)
            {
                listArchivosCarga.Add(new CatalogoInfo { IdItem = archivo.IdCargaArchivo, Descripcion = archivo.Version });
            }

            if (listArchivosCarga.Count != default(int))
            {
                // Obtener los autorizadores.
                List<EjecutorInfo> listAutorizadores = this.comunesNegocio.GetAutorizador(listArchivosCarga).ToList();

                foreach (EjecutorInfo autorizador in listAutorizadores)
                {
                    listCargasRealizadasByArchivo.Where(p => p.IdCargaArchivo == autorizador.IdCargaArchivo && p.Version == autorizador.VersionArchivo).Single().Autorizador = autorizador.NombreEjecutor;
                }
            }

            // Obtener los versionadores.
            List<CatalogoInfo> listVersionadores = this.comunesNegocio.GetNombreVersionador(listArchivosCarga).ToList();

            foreach (CatalogoInfo versionador in listVersionadores)
            {
                listCargasRealizadasByArchivo.Where(p => p.IdCargaArchivo == versionador.IdItem).Single().NombreEjecutorCarga = versionador.Descripcion;
            }

            return listCargasRealizadasByArchivo;
        }

        /// <summary>
        /// Obtiene todas las cargas y recargas de archivos realizadas de acuerdo a los filtros.
        /// </summary>
        /// <param name="archivoAsociadoFilters">Filtros para la búsqueda.</param>
        /// <returns>Lista con las cargas y recargas de archivos.</returns>
        public List<ArchivoCargadoInfo> GetCargasRealizadasByPeriodoTodosEstatus(ArchivoAsociadoProyectoInfo archivoAsociadoFilters)
        {
            List<ArchivoCargadoInfo> listCargasRealizadas;

            listCargasRealizadas = this.daoConsultaCargas.GetCargasRealizadasByPeriodoTodosEstatus(archivoAsociadoFilters).ToList();

            List<ArchivoCargadoInfo> listCargasRealizadasByArchivo = ComunesNegocio.GetArchivoWithLastProcess(listCargasRealizadas);

            List<CatalogoInfo> listArchivosCarga = new List<CatalogoInfo>();

            foreach (ArchivoCargadoInfo archivo in listCargasRealizadasByArchivo)
            {
                listArchivosCarga.Add(new CatalogoInfo { IdItem = archivo.IdCargaArchivo, Descripcion = archivo.Version });
            }

            if (listArchivosCarga.Count != default(int))
            {
                // Obtener los autorizadores.
                List<EjecutorInfo> listAutorizadores = this.comunesNegocio.GetAutorizador(listArchivosCarga).ToList();

                foreach (EjecutorInfo autorizador in listAutorizadores)
                {
                    listCargasRealizadasByArchivo.Where(p => p.IdCargaArchivo == autorizador.IdCargaArchivo && p.Version == autorizador.VersionArchivo).Single().Autorizador = autorizador.NombreEjecutor;
                }
            }

            // Obtener los versionadores.
            List<CatalogoInfo> listVersionadores = this.comunesNegocio.GetNombreVersionador(listArchivosCarga).ToList();

            foreach (CatalogoInfo versionador in listVersionadores)
            {
                listCargasRealizadasByArchivo.Where(p => p.IdCargaArchivo == versionador.IdItem).Single().NombreEjecutorCarga = versionador.Descripcion;
            }

            return listCargasRealizadasByArchivo;
        }
    }
}
